package model;

import java.awt.Image;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import model.Field.Directions;
       

/**
 *
 * @author Misja
 */

public class Player extends Part  {

    public Player(Image appereance) {
        super(appereance);
        super.setMovable(true);
    }

    @Override
    public boolean move(Directions direction) {
        HashMap<Field, Part> changes = new HashMap<>();
        Field firstField = this.currentField;
        Field activeField;

        // buur veld wordt bepaald en opgeslagen.
        Field neighbor = firstField.getNeighbor(direction);

        // het spel element van het eerste veld wordt tijdelijk bewaard.
        Part currentPart = firstField.getPart();

        // eind conditie wordt bepaald
        boolean endCondition = false;

        /* Hier wordt er gekeken of er wel een buur veld is
         * als er geen buur veld is dan stop de functie. */
        if (neighbor == null) {
            return false;
        }

        // Eerste actie wordt altijd opgeslagen.
        changes.put(firstField, null);

        while (endCondition == false) {
            // Hier word gekeken of er een GamePart zit in het buur veld.
            if (neighbor.getPart() == null) {
                // Eind conditie is vervult loop stopt.
                changes.put(neighbor, currentPart);
                endCondition = true;
                break;
            }

            // Hier word gekeken of het onder deel kan worden verplaats;
            if (neighbor.getPart().isMovable()) {
                // Het huidige GamePart wordt in het buur veld opgeslagen.
                changes.put(neighbor, currentPart);
                // Huidige GamePart wordt gevuld met het op object van het buur veld.
                currentPart = neighbor.getPart();
                // Het huidige veld wordt het buur veld.
                activeField = neighbor;
                // Het buur veld wordt de het buur veld van het huidige veld.
                neighbor = activeField.getNeighbor(direction);

                // Als er geen buur veld is dan stop de loop.
                if (neighbor == null) {
                    break;
                }

            } else {
                // Als een onderdeel niet verplaatsbaar is stop de loop.
                break;
            }
        }

        // Kijkt eraan de eindconditie is voldaan zoja dan voert hij het uit.
        if (endCondition) {
            Iterator<Map.Entry<Field, Part>> it = changes.entrySet().iterator();
            while (it.hasNext()) {
                Map.Entry<Field, Part> entry = it.next();
                Field t = entry.getKey();
                Part p = entry.getValue();
                t.setPart(p);
            }
        }
        return true;
    }   
}